package com.all.play.mysvnbanchone.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by 聪明一只哈 on 2018/5/21.
 * Time: 2018/5/21  8:28
 */

public class MyNewItemDecration extends RecyclerView.ItemDecoration {

    //3.1设置默认值
    private int orientaion = LinearLayoutManager.VERTICAL;

    //6.设置分割线
    private Drawable mDivider;
    //6.1先设置使用系统默认分割线
    private int[] attr = new int[]{android.R.attr.listDivider};

    public MyNewItemDecration(Context context, int orientaion) {
        TypedArray typedArray =
                context.obtainStyledAttributes(attr);

        mDivider = typedArray.getDrawable(0);
        typedArray.recycle();
        //6.2设置方向
        setOrientaion(orientaion);
    }

    //3.矩形区域,RecycleView会根据布局表格还是线性来设置不同的形状
    public void setOrientaion(int orientaion) {
        if (orientaion != LinearLayoutManager.HORIZONTAL
                && orientaion != LinearLayoutManager.VERTICAL) {
            throw new IllegalArgumentException("列表方向错误");
        }
        this.orientaion = orientaion;
    }

    /**
     * @param outRect
     * @param view    RecycleView的条目
     * @param parent
     * @param state
     */
    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        //1.RecycleView会回调此方法,获得条目的偏移量
        //--1.通过rect获得条目之间的间隔距离(宽度),Rect矩形区域
        //每个条目都会调用该方法

        //4.对应不同的方向,设置不同的分割线逻辑
        if (orientaion == LinearLayoutManager.VERTICAL) {
            //5.--------设置矩形区域的位置----------,
            //我觉得这里设置的是偏移的距离
            /*
            * getItemOffests可以通过outRect.set(l,t,r,b)
            * 设置指定itemview的paddingLeft，paddingTop，
            * paddingRight， paddingBottom
            *
            * */
            // 矩形区域的左上右下
            //5.1此处right的值,暂且为0,当bottom的值决定后,
            // 将其拉伸变宽
            //6.2设置矩形高度
            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
        } else {//列表方向是水平方向
            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
        }
    }


    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        //2.RecycleView会回调此方法,定义条目绘制

        //6.3分方向进行绘制
        if (orientaion == LinearLayoutManager.VERTICAL) {
            drawVertical(c, parent);//宽度填充,填充需要parent来决定
        } else {//列表方向是水平方向
            drawHorizontal(c, parent);
        }

    }

    private void drawHorizontal(Canvas c, RecyclerView parent) {
        //列表方向是横向,画竖直的分割线

        int top = parent.getPaddingTop();
//        int bottom=parent.getHeight()-parent.getPaddingBottom();
        int bottom = parent.getChildAt(0).getHeight();
        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            int left = child.getRight() + params.rightMargin + Math.round(child.getTranslationX());
            int right = left + mDivider.getIntrinsicWidth();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }

    }

    private void drawVertical(Canvas c, RecyclerView parent) {
        //列表是竖向,需要画水平方向的分割线

        //6.6设置左上右下
        //6.6.1 recycle含有内边距
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();
        //6.7,而top和bottom则需要根据每一个子view来进行设置
        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            //6.7.2设置top 和 bottom
            View child = parent.getChildAt(i);

            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            //6.7.3矩形的高的(值)数据=子条目的底部高度数据+子条目的外边距+条目上下滑动时产生的偏移量
            int top = child.getBottom() + params.bottomMargin + Math.round(child.getTranslationY());
            //6.7.4矩形的底的(值)数据=top+填充分割线的高度
            int bottom = top + mDivider.getIntrinsicHeight();
            //6.5设置分割线画的位置
            mDivider.setBounds(left, top, right, bottom);

            //==================================================
            //第一个位置,添加分割线
            //不能放在循环内,不然列表滑动,只要位于0位置,都会执行此代码
//            if (i==0){
//                mDivider.setBounds(left, child.getTop() - params.topMargin,
//                        right, top + mDivider.getIntrinsicHeight());
//            }


            //==================================================
            //6.4 画水平线
            mDivider.draw(c);
        }
// 6.7.1放在循环内绘制       //6.5设置分割线画的位置
//        mDivider.setBounds(left,0,right,0);
//        //6.4 画水平线
//        mDivider.draw(c);

    }
}
